/*
 * $Header: /opt/javacvs/util/src/main/java/com/uusee/util/StringUtils.java,v 1.9 2008/07/17 05:12:17 wangrui Exp $
 * $Revision: 1.9 $
 * $Date: 2008/07/17 05:12:17 $
 * ============================================================================
 *
 * Copyright (c) 2007 Beijing uusee Tech CO.,  All rights reserved.
 *
 * ============================================================================
 */
package com.uusee.util;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.oro.text.regex.Pattern;
import org.apache.oro.text.regex.PatternCompiler;
import org.apache.oro.text.regex.PatternMatcher;
import org.apache.oro.text.regex.Perl5Compiler;
import org.apache.oro.text.regex.Perl5Matcher;
import org.apache.oro.text.regex.Perl5Substitution;
import org.apache.oro.text.regex.Util;


/**
 * 字符串工具类
 * 
 * @author duyi
 * 
 */
public class StringUtils {
	private static Log log = LogFactory.getLog(StringUtils.class);

	/**
	 * 判断字符串是否是空或是空串,不忽略空格
	 * 
	 * @param str 字符串
	 * @return 空:true 非空false
	 */
	public static boolean isEmpty(String str) {
		if (str == null) {
			if (log.isDebugEnabled()) {
				log.debug("字符串为null");
			}
			return true;
		}
		if (str.equals("")) {
			if (log.isDebugEnabled()) {
				log.debug("字符串为空串");
			}
			return true;
		}
		return false;
	}

	/**
	 * 判断字符串是否不是空或不是空串,不忽略空格
	 * 
	 * @param str 字符串
	 * @return 非空:true 空false
	 */
	public static boolean isNotEmpty(String str) {
		return !isEmpty(str);
	}

	/**
	 * 判断字符串是否是空或是空串,忽略空格
	 * 
	 * @param str 字符串
	 * @return 空:true 非空false
	 */
	public static boolean isEmptyAfterTrim(String str) {
		if (str == null) {
			if (log.isDebugEnabled()) {
				log.debug("字符串为null");
			}
			return true;
		}
		if (str.trim().equals("")) {
			if (log.isDebugEnabled()) {
				log.debug("字符串在trim后为空串");
			}
			return true;
		}
		return false;
	}

	/**
	 * 判断字符串是否不是空或不是空串,忽略空格
	 * 
	 * @param str 字符串
	 * @return 非空:true 空false
	 */
	public static boolean isNotEmptyAfterTrim(String str) {
		return !isEmptyAfterTrim(str);
	}

	/**
	 * 判断字符串列表中是否有不为空或不为空串的字符串,不忽略空格
	 * 
	 * @param str 字符串列表
	 * @return 全部字符串都为空:true 有任意一个字符串非空false
	 */
	public static boolean isAllEmpty(String... str) {
		if (log.isDebugEnabled()) {
			log.debug("待判断字符串数量: " + str.length);
		}
		for (int i = 0; i < str.length; i++) {
			if (isNotEmpty(str[i])) {
				if (log.isDebugEnabled()) {
					log.debug("[" + str[i] + "]非空,位置: [" + (i + 1) + "]");
				}
				return false;
			}
		}
		return true;
	}

	/**
	 * 判断字符串列表中是否有为空或为空串的字符串,不忽略空格
	 * 
	 * @param str 字符串列表
	 * @return 全部字符串都不为空:true 有任意一个字符串为空false
	 */
	public static boolean isAllNotEmpty(String... str) {
		if (log.isDebugEnabled()) {
			log.debug("待判断字符串数量: " + str.length);
		}
		for (int i = 0; i < str.length; i++) {
			if (isEmpty(str[i])) {
				if (log.isDebugEnabled()) {
					log.debug("字符串为空,位置: [" + (i + 1) + "]");
				}
				return false;
			}
		}
		return true;
	}

	/**
	 * 判断字符串列表中是否有不为空或不为空串的字符串,忽略空格
	 * 
	 * @param str 字符串列表
	 * @return 全部字符串都为空:true 有任意一个字符串非空false
	 */
	public static boolean isAllEmptyAfterTrim(String... str) {
		if (log.isDebugEnabled()) {
			log.debug("待判断字符串数量: " + str.length);
		}
		for (int i = 0; i < str.length; i++) {
			if (isNotEmptyAfterTrim(str[i])) {
				if (log.isDebugEnabled()) {
					log.debug("[" + str[i] + "]trim后非空,位置: [" + (i + 1) + "]");
				}
				return false;
			}
		}
		return true;
	}

	/**
	 * 判断字符串列表中是否有为空或为空串的字符串,忽略空格
	 * 
	 * @param str 字符串列表
	 * @return 全部字符串都不为空:true 有任意一个字符串为空false
	 */
	public static boolean isAllNotEmptyAfterTrim(String... str) {
		if (log.isDebugEnabled()) {
			log.debug("待判断字符串数量: " + str.length);
		}
		for (int i = 0; i < str.length; i++) {
			if (isEmptyAfterTrim(str[i])) {
				if (log.isDebugEnabled()) {
					log.debug("字符串trim后为空,位置: [" + (i + 1) + "]");
				}
				return false;
			}
		}
		return true;
	}

	/**
	 * 判断字符串列表中是否有任意字符串为空或为空串的字符串,不忽略空格
	 * 
	 * @param str 字符串列表
	 * @return 全部字符串都不为空:false 有任意一个字符串为空:true
	 */
	public static boolean isAnyOneEmpty(String... str) {
		return !isAllNotEmpty(str);
	}

	/**
	 * 判断字符串列表中是否有任意字符串不为空或不为空串的字符串,不忽略空格
	 * 
	 * @param str 字符串列表
	 * @return 全部字符串都为空:false 有任意一个字符串不为空:true
	 */
	public static boolean isAnyOneNotEmpty(String... str) {
		return !isAllEmpty(str);
	}

	/**
	 * 判断字符串列表中是否有任意字符串为空或为空串的字符串,忽略空格
	 * 
	 * @param str 字符串列表
	 * @return 全部字符串都不为空:false 有任意一个字符串为空:true
	 */
	public static boolean isAnyOneEmptyAfterTrim(String... str) {
		return !isAllNotEmptyAfterTrim(str);
	}

	/**
	 * 判断字符串列表中是否有任意字符串不为空或不为空串的字符串,忽略空格
	 * 
	 * @param str 字符串列表
	 * @return 全部字符串都为空:false 有任意一个字符串不为空:true
	 */
	public static boolean isAnyOneNotEmptyAfterTrim(String... str) {
		return !isAllEmptyAfterTrim(str);
	}

	public static String removeLastLetter(StringBuffer str) {
		if ( str != null && str.length() > 1) {
			str.deleteCharAt(str.length() - 1);
		}
		return str.toString();
	}

	public static String replace(String html, String reg, String newStr) throws Exception {
		String text = html;

		PatternCompiler compiler = new Perl5Compiler();
		Pattern p = compiler.compile(reg);
		PatternMatcher pm = new Perl5Matcher();
		text = Util.substitute(pm, p, new Perl5Substitution(newStr), html, Util.SUBSTITUTE_ALL);

		return text;
	}

	/**
	 * 比较两个字符串的大小
	 * 
	 * @param lsz
	 * @param rsz
	 * @return
	 */
	public static int compare(String lsz, String rsz) {
		int lLen = lsz.length();
		int rLen = rsz.length();
		int len = 0;

		if (lLen == 0 && rLen > 0)
			return -1;
		if (rLen == 0 && lLen > 0)
			return 1;

		if (lLen > rLen)
			len = rLen;
		else
			len = lLen;
		for (int i = 0; i < len; i++)
			if (lsz.charAt(i) > rsz.charAt(i))
				return 1;
			else if (lsz.charAt(i) < rsz.charAt(i))
				return -1;
		return 0;
	}
	
	/**
	 * 处理 script 标签
	 * @return
	 */
	public static String removeScripttag(String hasScriptStr){
		   java.util.regex.Pattern p = null;
		   java.util.regex.Matcher m = null;
		   String regx = "(<script[\\s\\S]*?</script[\\s]*>)";
		   p = java.util.regex.Pattern.compile(regx);
		   m = p.matcher(hasScriptStr);   
		   StringBuffer sb = new StringBuffer();
		   if(m.find()){
		    //System.out.println("===result is ==="+result+"==="+m.groupCount());
		   String temp = m.group();
		   String temp1 = temp.replace("<", "&lt;");
		   temp1 = temp1.replaceAll(">", "&gt;");
		   int start = m.start();
		   int end = m.end();
		   //hasScriptStr = hasScriptStr.replaceAll(temp, temp1);
		   sb.append(hasScriptStr.substring(0, start));
		   sb.append(temp1);
		   sb.append(hasScriptStr.substring(end));
		   return removeScripttag(sb.toString());
		   
		   }else{
			   return hasScriptStr;
		   }
	}
}
